package com.cicc.springboot.utile;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.cicc.springboot.entity.SrmSupplierBasicEntity;
import com.cicc.springboot.mapper.SupplierMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.*;

/**
 * @Author 张月鹿
 */

@Component
public class SupplierBasicExcelListener extends AnalysisEventListener<SrmSupplierBasicEntity> {

    // 新增用于记录成功插入的数量
    private static final int BATCH_COUNT = 20;
    private List<SrmSupplierBasicEntity> list = new ArrayList<>();
    private final SupplierMapper supplierMapper;


    @Autowired
    public SupplierBasicExcelListener(SupplierMapper supplierMapper) {
        this.supplierMapper = supplierMapper;
    }

    @Override
    public void invoke(SrmSupplierBasicEntity data, AnalysisContext context) {
        list.add(data);
        if (list.size() >= BATCH_COUNT) {
            saveData();
            list.clear();
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        saveData();
    }


    private void saveData() {
        List<SrmSupplierBasicEntity> validData = new ArrayList<>();
        Set<String> supplierNumberSet = new HashSet<>();

        // 先遍历 Excel 数据，去除 Excel 内部的重复物料号，并保留一个
        for (SrmSupplierBasicEntity data : list) {
            // 如果物料号已经存在于 Set 中，说明 Excel 内部有重复的数据
            if (supplierNumberSet.add(data.getErpCode())) {
                // 将保留的物料号添加到 validData 列表中
                validData.add(data);
            } else {
                // 输出 Excel 中的重复数据
                System.out.println("Excel 中重复数据，保留一个，跳过: " + data.getErpCode());
            }
        }

        // 接下来与数据库中的数据进行比对，插入不存在的数据
        List<SrmSupplierBasicEntity> finalDataToInsert = new ArrayList<>();

        for (SrmSupplierBasicEntity data : validData) {
            System.out.println("现在拿到的validata是" + data);
            LambdaQueryWrapper<SrmSupplierBasicEntity> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.eq(SrmSupplierBasicEntity::getErpCode, data.getErpCode());

            // 校验数据库中是否存在相同的 materialNumber
            if (supplierMapper.selectCount(queryWrapper) == 0) {
                finalDataToInsert.add(data);  // 只有不存在的记录才添加到待保存列表中         } else {
                System.out.println("数据库中已存在，跳过: " + data.getErpCode());
            }

        }

        // 将不重复且数据库中不存在的数据插入数据库
        if (!finalDataToInsert.isEmpty()) {
            for (SrmSupplierBasicEntity valid : finalDataToInsert) {
                supplierMapper.insert(valid);
            }
            System.out.println("批量保存 " + finalDataToInsert.size() + " 条数据到数据库");
        } else {
            System.out.println("无新的数据保存到数据库");
        }

    }


}
